<?php
require_once 'utiles.php';
// DECLARACION E IMPLEMENTACION  DE FUNCIONES

/**
 * Comprueba que no exista el diario ingresado
 * @param string $fecha
 * @param mySqli $conn
 * @return boolean
 */
function limpiarDatos() {
    global $conn;
    $sql = 'SET FOREIGN_KEY_CHECKS=0;
truncate gasto;
truncate compra;
truncate diario;
SET FOREIGN_KEY_CHECKS=1;';
    $conn->abmQuery($sql);
}

function diarioYaIngresado($fecha, $conn) {
    if (empty($fecha)) {
        return false;
    }
    $idDiario = 0;
    $sqlValidacion = "SELECT id FROM diario WHERE fecha = '$fecha'";
    $existe = $conn->selectQuery($sqlValidacion);
    if ($existe) {
        $idDiario = $existe[0]->id;
    }
    return $idDiario;
}

function borrarGastosDeDiario($id_diario, $conn) {
    if (intval($id_diario) <= 0) {
        return false;
    }
    $sqlBorrarGasto = "DELETE FROM gasto WHERE id_diario = $id_diario";
    $conn->abmQuery($sqlBorrarGasto);
}

function borrarComprasDeDiario($id_diario, $conn) {
    if (intval($id_diario) <= 0) {
        return false;
    }
    $sqlBorrarCompras = "DELETE FROM compra WHERE id_diario = $id_diario";
    $conn->abmQuery($sqlBorrarCompras);
}

function borrarDiario($id_diario, $conn) {
    if (intval($id_diario) <= 0) {
        return false;
    }
    $sqlBorrarDiario = "DELETE FROM diario WHERE id = $id_diario";
    $conn->abmQuery($sqlBorrarDiario);
}

function borrarDatosDiario($id_diario, $conn) {
    borrarGastosDeDiario($id_diario, $conn);
    borrarComprasDeDiario($id_diario, $conn);
    borrarDiario($id_diario, $conn);
}

/**
 * Es una funcion que inserta una fila en la tabla diario
 * @param float $caja_monto
 * @param float $ahorro_monto
 * @param float $banco_monto
 * @param date $fecha
 * @param mySqli $conn
 * @return int
 */
function insertarDiario($caja_monto, $ahorro_monto, $banco_monto, $fecha, $conn) {

    $sqlDiario = "INSERT INTO diario SET
			caja_monto = '" . $caja_monto . "',	
			ahorro_monto = '" . $ahorro_monto . "',
			banco_monto = '" . $banco_monto . "',
			fecha = '" . $fecha . "'";

    $conn->abmQuery($sqlDiario);
    $idDiario = $conn->getLastInsertId();
    return $idDiario;
}

function insertarGastos($id_tipo_gasto, $monto, $observacion, $idDiario, $conn) {

    $sqlGasto = "INSERT INTO gasto SET
			id_diario =  $idDiario,
	        id_tipo_gasto = " . intval($id_tipo_gasto) . ",
	        monto = '" . $monto . "',
	        observacion = '" . $observacion . "'";
    $rtdo = $conn->abmQuery($sqlGasto);
    if(!$rtdo) logError($sqlGasto);
    return $rtdo;
}

/**
 * Inserta una compra
 * @param int $id_tipo_compra
 * @param float $monto
 * @param string $observacion
 * @param int $idDiario
 * @param MySqli $conn
 * @return bool
 */
function insertarCompra($id_tipo_compra, $monto, $observacion, $idDiario, $conn) {

     $sqlCompra = "INSERT INTO compra SET

			id_diario =  $idDiario,
	        id_tipo_compra = " . intval($id_tipo_compra) . ",
	        monto = '" . $monto . "',
	        observacion = '" . $observacion . "'";
    $rtdo = $conn->abmQuery($sqlCompra);
    if(!$rtdo) logError($sqlCompra);
    //$rtdo puede ser true o false
    return $rtdo;
}

/**
 *
 * @param int $id
 * @param mysqli $conn
 * @return float 
 */
function calcularEfectivoDiario($id, $conn) {
    $efectivo = 0.00;
    $sqlEfectivo = "SELECT caja_monto, ahorro_monto FROM diario WHERE id= $id ";
    $rdsEfectivo = $conn->selectQuery($sqlEfectivo);
    if ($rdsEfectivo) {
        $efectivo = floatval($rdsEfectivo[0]->caja_monto) + floatval($rdsEfectivo[0]->ahorro_monto);
    }

    return $efectivo;
}

/**
 *
 * @param int $id_diario
 * @param mysqli $conn
 * @return float 
 */
function calcularComprasTotales($id_diario, $conn) {
    $comprasTotales = 0.00;
    $sqlSumaCompras = "SELECT SUM(monto) as compras FROM compra WHERE id_diario=$id_diario";
    $dataCompra = $conn->selectQuery($sqlSumaCompras);
    if ($dataCompra) {
        $comprasTotales = floatval($dataCompra[0]->compras);
    }
    return $comprasTotales;
}

/**
 *
 * @param int $id_diario
 * @param mysqli $conn
 * @return float 
 */
function calcularGastosTotales($id_diario, $conn) {
    $gastosTotales = 0.00;
    $sqlSumaGasto = "SELECT SUM(monto) AS gastos FROM gasto WHERE id_diario=$id_diario";
    $dataGastos = $conn->selectQuery($sqlSumaGasto);
    if ($dataGastos) {
        $gastosTotales = $dataGastos[0]->gastos;
    }
    return $gastosTotales;
}

/**
 * 
 * @global mysqli $conn
 * @param int $mes numero de mes de ventas que busco | Por default es 13 = todo el año
 * @return array
 */
function obtenerVentasMensualesAcumuladas($mes = 13) {
    global $conn;
    if (intval($mes) == 13) {
        $sql = 'SELECT MONTH(fecha) as mes, sum(ventas) as ventasAcumuladas 
            FROM diario 
            GROUP BY mes
            ORDER BY mes';
    } else {
        $sql = "SELECT $mes as mes, sum(ventas) as ventasAcumuladas FROM diario WHERE MONTH(fecha) = $mes";
    }
    $rds = $conn->selectQuery($sql);
    return $rds;
}

function obtenerGastosMensualesAcumulados($mes = 13) {
    global $conn;
    if (intval($mes) == 13) {
        $sql = "SELECT MONTH(d.fecha) as mes, SUM(monto) AS gastosAcumulados FROM gasto g
        INNER JOIN diario d ON g.id_diario = d.id
        GROUP BY mes
        ORDER BY mes";
    } else {
        $sql = "SELECT $mes as mes, SUM(monto) AS gastosAcumulados FROM gasto g
        INNER JOIN diario d ON g.id_diario = d.id
        WHERE MONTH(d.fecha) = $mes";
    }
    $rds = $conn->selectQuery($sql);
    return $rds;
}

function obtenerComprasMensualesAcumuladas($mes = 13) {
    global $conn;
    if (intval($mes) == 13) {
        $sql = "SELECT MONTH(d.fecha) as mes, SUM(monto) AS comprasAcumuladas FROM compra g
        INNER JOIN diario d ON g.id_diario = d.id
        GROUP BY mes
        ORDER BY mes";
    } else {
        $sql = "SELECT $mes as mes, SUM(monto) AS comprasAcumuladas FROM compra g
        INNER JOIN diario d ON g.id_diario = d.id
        WHERE MONTH(d.fecha) = $mes";
    }

    $rds = $conn->selectQuery($sql);
    return $rds;
}

function obtenerVentasSemanales($mes) {
    global $conn;
    $sql = "SELECT SUM(ventas) as ventas_acumuladas, week(FECHA) as semana FROM diario WHERE MONTH(fecha) = $mes group by semana";
    $rds = $conn->selectQuery($sql);
    return $rds;
}

function obtenerVentasDiarias($mes) {
    global $conn;
    $sql = 'SELECT DAY(fecha) as dia, ventas as monto FROM diario WHERE MONTH(fecha) = ' . $mes . ' ORDER BY dia';
    $rds = $conn->selectQuery($sql);
    return $rds;
}

function obtenerGastosDiarios($mes) {
    global $conn;
    if (intval($mes) <= 0)
        return false;
    $sqlGastosMensuales = "SELECT DAY(d.fecha) as dia, SUM(monto) AS monto FROM gasto g
        INNER JOIN diario d ON g.id_diario = d.id
        WHERE MONTH(d.fecha) = $mes
        GROUP BY d.id ORDER BY dia";
    $rdsGastosMensuales = $conn->selectQuery($sqlGastosMensuales);
    return $rdsGastosMensuales;
}

function obtenerComprasDiarias($mes) {
    global $conn;
    if (intval($mes) <= 0)
        return false;
    $sqlComprasMensuales = "SELECT DAY(d.fecha) as dia, SUM(monto) AS monto FROM compra g
        INNER JOIN diario d ON g.id_diario = d.id
        WHERE MONTH(d.fecha) = $mes
        GROUP BY d.id ORDER BY dia";
    $rdsComprasMensuales = $conn->selectQuery($sqlComprasMensuales);
    return $rdsComprasMensuales;
}

/* Deprecadas!!
  function calcularSaldo($id_diario, $conn) {
  $gastosTotales = calcularGastosTotales($id_diario, $conn);
  $comprasTotales = calcularComprasTotales($id_diario, $conn);
  $efectivo = calcularEfectivoDiario($id_diario, $conn);
  $resultado = intval($efectivo) - (intval($gastosTotales) + intval($comprasTotales));
  echo "
  <hr>
  gastos = $gastosTotales <br>
  compras = $comprasTotales <br>
  efectivo = $efectivo <br>
  resultado $resultado <br>
  <hr>
  ";
  return $resultado;
  }

  function obtenerSaldo($id_diario, $conn) {
  if (intval($id_diario) <= 0)
  return false;
  $sqlSaldo = "SELECT saldo FROM diario WHERE id = $id_diario";
  $rdsSaldo = $conn->selectQuery($sqlSaldo);
  if (!empty($rdsSaldo)) {
  return $rdsSaldo[0]->saldo;
  }
  return false;
  }

 */

/**
 * Devuelve el id del diario de ayer (OJO! la condición es que se tiene que cargar todos los días el excel,
 * aunque sea con importe 0, pero se tiene q cargar!)
 * @param int $id_diario_hoy
 * @param mysqli $conn
 * @return int
 */
function obtenerIdUltimoDiarioCargado($id_diario_hoy, $conn) {
    $id_diario_ayer = 0;
    $sqlUltimoDiaCargado = "SELECT id FROM diario WHERE fecha < (SELECT fecha FROM diario WHERE id = $id_diario_hoy) ORDER BY fecha desc LIMIT 1";
//    $sql = "SELECT id FROM diario 
//        WHERE fecha = DATE_SUB( (SELECT fecha FROM diario WHERE id = $id_diario_hoy),INTERVAL 1 DAY)";
    $rds = $conn->selectQuery($sqlUltimoDiaCargado);
    if ($rds) {
        $id_diario_ayer = $rds[0]->id;
    }
    return $id_diario_ayer;
}

function calcularVentas($id_diario, $conn) {
    //menor o igual a 1, porque recien voy a poder calcular las ventas del día 1
    // cuando procese el día 2. Es decir, el día 1 ($id_diario = 1) no tengo que procesar
    //ninguna venta
    $ventas = 0;
    if (intval($id_diario) <= 1) {
        return $ventas;
    }

    $idUltimoDiarioCargado = obtenerIdUltimoDiarioCargado($id_diario, $conn);
    //echo "[LOG] ultimo id cargado = " . $idUltimoDiarioCargado . "<br>";
    if ($idUltimoDiarioCargado <= 0) {
        //print('NO SE PUEDE CALCULAR LAS VENTAS PORQUE NO ESTÁN CARGADOS LOS DATOS DEL DÍA ANTERIOR');
        return $ventas;
    }
    $efectivoUltimoDiaCargado = calcularEfectivoDiario($idUltimoDiarioCargado, $conn);
    $efectivoDeHoy = calcularEfectivoDiario($id_diario, $conn);
    $gastosTotales = calcularGastosTotales($id_diario, $conn);
    $comprasTotales = calcularComprasTotales($id_diario, $conn);
    //echo "[LOG] efectivo ayer = " . $efectivoUltimoDiaCargado . "<br>";
    $ventas = $efectivoDeHoy - ($efectivoUltimoDiaCargado - $gastosTotales - $comprasTotales);
//    echo "[LOG] VENTAS = " . $ventas . "<br>";
//    echo "
//    <hr>
//    gastos = $gastosTotales <br>
//    compras = $comprasTotales <br>
//    efectivo hoy = $efectivoDeHoy <br>
//    efectivo ayer = $efectivoUltimoDiaCargado <br>
//<hr>
//    ";
    return $ventas;
}

/*
  function ingresarSaldo($id_diario, $saldo, $conn) {
  if (intval($id_diario) <= 0) {
  return false;
  }
  $sqlSaldo = "UPDATE diario SET saldo = '$saldo' WHERE id = $id_diario";
  $ok = $conn->abmQuery($sqlSaldo);
  return $ok;
  }
 */

/**
 * Ingresa las ventas DEL DIA ANTERIOR!!!
 * @param int $id_diario_actual id del diario que estoy cargando (OJO! no es el mismo donde voy a ingresar las ventas)
 * @param float $montoVentas
 * @param mySqli $conn
 * @return boolean
 */
function ingresarVentas($id_diario, $montoVentas, $conn) {
    //menor o igual a 1, porque recien voy a poder calcular las ventas del día 1
    // cuando procese el día 2. Es decir, el día 1 ($id_diario = 1) no tengo que procesar
    //ninguna venta
//    if (intval($id_diario) <= 1) {
//        return false;
//    }
    $sqlVentas = "UPDATE diario SET ventas = '$montoVentas' WHERE id = $id_diario";
    $ok = $conn->abmQuery($sqlVentas);
    return $ok;
}

function getDiarios($mes = 0) {
    global $conn;
    if (intval($mes) > 0) {
        $where = ' WHERE MONTH(d.fecha) = ' . $mes;
    }
    $sql = "SELECT
        d.id,
        d.fecha,        
        (d.caja_monto + d.ahorro_monto) as efectivo,
        d.ventas, 
        SUM(g.monto) as gastos, 
        SUM(c.monto) as compras 
        FROM diario d 
        LEFT JOIN gasto g ON g.id_diario = d.id
        LEFT JOIN compra c ON c.id_diario = d.id
        $where
        GROUP BY d.id
        order by d.fecha desc ";
    $rds = $conn->selectQuery($sql);
    return $rds;
}
